#coding=utf-8
import requests,datetime,db,sys,os
from bs4 import BeautifulSoup
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
"""
功能描述：爬取贵州省公共资源交易中心新闻网站-政府采购数据
channelId：jygkcgxm-交易公告，jygkzsjg-交易结果公示，jygkcgzs-流标公示，jygkzbgg-资格结果公示，jygggzsx-项目澄清，
"""

class tradeNotice(object):
    def __init__(self):
        self.pageUrl = 'http://www.gzsggzyjyzx.cn/%s/index_%d.jhtml'
        self.info_type = {'jygkcgxm':'4B1', 'jygkcgzs':'4B2', 'jygkzbgg':'4B3', 'jygkzsjg': '4B4'} #信息类型
    """
    功能描述：根据网页url获取html内容
    """
    def getHTMLText(self, url):
        try:
            req = requests.get(url = url)
            return req.text;
        except:
            return ""

    """
    获取当前拥有的页数
    """
    def getPage(self, url):
        html = self.getHTMLText(url)
        bf = BeautifulSoup(html, 'html.parser')
        pagesList = bf.find_all('ul', class_='pages-list')
        pageLi = pagesList[0].li.a.string
        return [int(pageLi[pageLi.find('/') + 1:pageLi.find('页')]), int(pageLi[pageLi.find('共') + 1:pageLi.find('条')])]

    """
    功能描述：根据url获取地址列表
    """
    def getDownUrls(self, url):
        html = self.getHTMLText(url)
        bf = BeautifulSoup(html, 'html.parser')
        listBox = bf.find_all('ul', id='listbox')
        ass = listBox[0].find_all('a')
        urls = []
        for a in ass:
            urls.append(a['href'])
        return urls
    """
    功能描述：获取内容
    """
    def getContent(self, url):
        html = self.getHTMLText(url)
        bf = BeautifulSoup(html, 'html.parser')

        #获取内容
        htmlContent = str(bf)
        replaceHtml = htmlContent.replace('</div></div></div></div></body></html>', '').replace('<div class="clear">', '<div class="clear"></div>')
        bfs = BeautifulSoup(replaceHtml, 'html.parser')
        content = bfs.find_all('div', class_='detail_box')[0]

        #获取标题
        title = bf.find_all('div', class_='article_head')[0].h2.string

        #获取来源
        source = bf.find_all('div', class_='article_subtitle')[0].find_all('span')
        #发布日期
        time = str(source[0].contents[0]).replace('发布时间：', '')
        #来源
        sourceName = str(source[1].contents[0]).replace('来源：', '')
        result = [title, str(content), time]
        return result

    """
    功能描述：执行
    """
    def executeSql(self, sql, param):
        try:
            with self.connection.cursor() as cursor:
                cursor.execute(sql, param);
            self.connection.commit()

        finally:
            self.connection.close();
if __name__ == '__main__':
    tn = tradeNotice()
    connection = db.getOracle();
    print(sys.getfilesystemencoding())
    try:
        for infoType in tn.info_type.keys():
            # 获得每个页面的地址，用来获取每个类型的页数
            pr = tn.pageUrl % (infoType, 1)
            pageObj = tn.getPage(pr)  # 获取当前的总页数
            pages = pageObj[0]
            total = pageObj[1]
            currentPage = 1
            currentNum = 0
            print('开始爬取：' + tn.info_type[infoType]  + '，共' + str(total) + '条...')
            exit = False
            while currentPage <= pages:
                url = tn.pageUrl % (infoType, currentPage)  # 每页的数据
                urls = tn.getDownUrls(url)  # 获取每页的内容页面
                for u in urls:
                    listId = u[-11:-6];
                    #先判断该url是否已经爬取过，如果爬取了直接终止所有爬取
                    sql = "select * from zww_inf3020c where \"list_id\"=" + listId;
                    # 如果已经存在或则日期为2月4号就不爬了
                    if not exit:
                        exit = db.countForOracle(sql, connection)
                    if not exit:
                        result = tn.getContent(u)  # 获取内容
                        exit = result[2][0:7] == '2018-01' #爬到2月4好就停止爬
                        re1 = [tn.info_type[infoType], '4B', listId, u,'P0']
                        params = result + re1
                        sql = "INSERT INTO zww_inf3020c (\"title\", \"content\", \"approve_date\", \"inf_type\", \"module_class\", \"list_id\", \"page_url\",\"state\") VALUES (:1, :2, :3, :4, :5, :6, :7, :8)"
                        db.executOracle(sql, params, connection);
                        # print(params)
                        currentNum = currentNum + 1
                        sys.stdout.write(tn.info_type[infoType] + '，共' + str(total) + '条，正下载第' + str(
                            currentNum) + '条，已完成%.2f%%' % float(currentNum / total * 100) + '\r')
                        sys.stdout.flush()
                    else:
                        print("存在已爬取的数据，停止爬取，跳出for循环")
                        break
                if exit:
                    print("存在已爬取的数据，停止爬取，跳出while循环")
                    break
                currentPage = currentPage + 1
            else:
                print('信息类型：' + infoType  + '下载完毕')
    except Exception as e:
        print(e)
    finally:
        connection.close();
    # page = tn.getPage('http://www.gzsggzyjyzx.cn/jygkzsgg/index_1.jhtml')
    # print(page)
    #获取每页的列表
    # url = 'http://www.gzsggzyjyzx.cn/jygkzsgg/index_1.jhtml'
    # urls = tn.getDownUrls(url)
    # print(urls)

    #获取内容
    # url = 'http://www.gzsggzyjyzx.cn/jygkzsgg/70376.jhtml'
    # result = tn.getContent(url)
    # print(result)
    # connection = tn.getMySqlConnect()
    # sql = 'INSERT INTO tb_trade_info (title, content, info_type, source_name, trade_type) VALUES (%s, %s, %s, %s, %s)'
    # params = ('Zhyea', 'tomorrow', 'M', 'asdf', 'aadf')
    # print(params)
    # tn.executeSql(sql, params)
    # print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    # u = '70376'
    # print(u[-11:-6])
    # sql = "select * from zww_inf3020c where \"page_url\"=" + u;
    # exit = db.countForOracle(sql, connection)
    # print(exit)

    # params = ['仁怀市大沙坝水库枢纽区上坝公路边坡治理工程仁怀市大沙坝水库枢纽区上坝公路边坡治理工程施工招标公告',
    #           '<div class="detail_box">\n<p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">1．招标条件</p><p>本招标项目仁怀市大沙坝水库枢纽区上坝公路边坡治理工程已由黔水建【2017】61号文批准建设，招标人（项目业主）为仁怀市大沙坝水利工程管理局建设资金来自社会资本，项目已具备招标条件，现对该项目的施工进行公开招标。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">2．项目概况与招标范围</p><p>2.1项目概况：对大沙坝水库枢纽区上坝公路边坡进行治理，主要包括：对大沙坝水库左岸溢洪道边坡两处蠕动变形区域采用“削坡减载+公路改造+抗滑桩+系统排水”进行边坡治理，并对布置于左岸的上坝公路破坏段（310米）进行改线和恢复；右岸上坝公路裸露边坡进行“挂网喷混+锚杆”治理，面积约12640㎡。</p><p>2.2建设地点：贵州省仁怀市茅台镇卢荣坝村</p><p>2.3计划工期：90日历天</p><p>2.4项目投资：9645100.00元</p><p>2.5标段划分：1个标段</p><p>2.6招标范围：建筑工程（左岸公路边坡处理、左岸上坝公路改线段（310m）、右岸上坝公路边坡治理）和施工临时工程。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">3．投标人资格要求</p><p>3.1本次招标要求投标人须具备建设行政主管部门核发的与本项目招标范围相适应的水利水电工程施工总承包三级及以上资质，并在人员、设备、资金等方面具有承担本项目施工的能力。</p><p>3.2 投标人必须是“贵州省水利建设市场信用信息平台（www.gzsljg.com）”中公示的企业。</p><p>3.3凡贵州省建设市场信用信息平台或其他官方网站公布限制参加水利工程投标且期限未满的单位，不得参加本工程投标。</p><p>3.4 本项目不接受联合体投标。</p><p>3.5 其他：无</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">4．资格审查方法</p><p>本次招标实行资格后审。资格审查的具体要求见招标文件。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">5．招标文件的获取</p><p>5.1 凡有意参加投标者，请于 2018年02月06日至2018年02月12日，采取以下方式获招标文件：在贵州省公共资源交易中心（www.gzsggzyjyzx.cn)下载获取招标文件。</p><p>5.2 招标文件每套售价 500.00元，图纸每套售价0.00元，售后不退。<p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">6．投标文件的递交</p><p>6.1 投标文件递交的截止时间为2018年02月26日13时00分00秒，地点为：贵州省公共资源交易中心（贵阳市遵义路65号）。</p><p>6.2 逾期送达或者未送达指定地点的招标文件，招标人不予受理。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">7．发布公告的媒介</p></p><p>本次招标公告同时在《中国采购与招标网》、《贵州省招标投标网》、《贵州省水利水电建设工程交易监督网》和《贵州省公共资源交易中心网》上发布。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">8．其他注意事项</p><p>注：未在“贵州省水利建设市场信用信息平台（www.gzsljg.com）”中公示的企业，请严格按照贵州省水利厅黔水建［2017］12号文要求完善企业信息。</p><p style="FONT-SIZE: 14pt; FONT-FAMILY: 微软雅黑; FONT-WEIGHT: bold; ">9．联系方式</p><p>招标人：仁怀市大沙坝水利工程管理局</p><p>地址：贵州省仁怀市</p><p>联系人：陈钦</p><p>电话：18985610856</p><p>招标代理机构：贵州聚力项目管理咨询有限公司</p><p>地址：贵州省贵阳市南明区花果园路花果园项目R-2区1栋（1）1单元31层8至12号</p><p>联系人：高毅</p><p>电话：15285649863</p><p>贵州省公共资源交易中心</p><p>联系地址：贵阳市遵义路65号</p><div class="preview_box"><div class="file"><span>文件预览:</span><br/><a href="http://new.gzsggzyjyzx.cn:8081/G2/gfm/upload!download.do?attachId=ff80808161524794016163de56a35c20" target="_blank">仁怀市大沙坝水库枢纽区上坝公路边坡治理工程1.26.3 - 填入时间.pdf</a><br/><a href="http://new.gzsggzyjyzx.cn:8081/G2/gfm/upload!download.do?attachId=ff80808161524794016163de77ae5c24" target="_blank">最高投标限价.pdf</a><br/></div><span color="red">重要提示:</span><p>1、在贵州省公共资源交易中心进行的工程建设招投标活动相关事宜均采用线上方式进行，潜在投标人凭办理的数字证书登录该系统参与招投标活动。办理数字证书请查看<a href="/bid_guide" target="_blank">服务指南</a>里的数字证书。</p><p>2、报名前请先到下载专区，下载贵州CA电子签章工具和数字证书驱动安装。</p><p>3、本公告未尽事宜详见招标（资格预审）文件，从公告处预览的招标（资格预审）文件仅供浏览，若要投标，请用CA证书登录交易系统购买下载文件。</p><a href="http://new.gzsggzyjyzx.cn:8081/G2" target="_blank"><div class="skip_link" id="4A1">购买文件</div></a></div>\n<!--详情页 end-->\n<div class="clear"></div>\n</div>',
    #           '2018-02-05', '4A1', '4A', '70236', 'http://www.gzsggzyjyzx.cn:80/jygkzsgg/70236.jhtml', 'P0']
    # sql = "INSERT INTO zww_inf3020c (\"title\", \"content\", \"approve_date\", \"inf_type\", \"module_class\", \"list_id\", \"page_url\",\"state\") VALUES (:1, :2, :3, :4, :5, :6, :7, :8)"
    #
    # print(params)
    # db.executOracle(sql, params, connection);
    # connection.close();